﻿using System.Diagnostics.Contracts;

namespace los5
{
    #region     知识回顾
    class Person
    {
        //特征—成员变量
        private int age;
        private string name;
        //金钱
        private int money;
        //行为—成员方法
        //初始化调用—构造函数
        //释放时调用—析构函数

    }
    #endregion
    #region     知识点一   成员属性的基本概念
    //基本概念
    //1.用于保护成员变量
    //2.为成员属性的获取和赋值添加逻辑处理
    //3.解决3p的局限性
    //  public—内外访问
    //  private—内部访问‘
    //  protected—内部和子类访问
    //  属性可以让成员变量在外部
    //  只能获取 不能修改 或者 只能修改 不能获取
    #endregion
    #region      知识点二   成员属性的基本语法
    //访问修饰符 属性类型 属性名
    //{
    //    get{}
    //    set{}
    //}
    class Person2
    {
        private string name;
        private int age;
        private int money;
        private bool sex;

        //属性命名一般使用 帕斯卡命名法
        public string Name
        {
            get//得到内容
            {
                //可以再返回之前添加一些逻辑规则
                //get意味着 这个属性可以获取的内容
                return name;
            }
            set//设置内容
            {
                //可以在设置之前添加一些逻辑规则
                //value 关键字 用于表示 外部传入的值
                name = value;
            }
        }
        public int Money
        {
            get
            {
                //解密处理
                return money - 5;
            }
            set
            {
                //加密处理
                if(value < 0)
                {
                    value = 0;
                    Console.WriteLine("钱不能少于0，强制设置为0了");
                }
                money = value + 5;
            }
        }
        #region     知识点五   get和set可以只有一个
        //注意：只有一个时 没必要在前面加访问修饰符
        //一般情况下 只会出现 只有get的情况 基本不会出现只有set
        #endregion
        public bool Sex
        {
            get
            {
                return sex;
            }
        }
        #region     知识点六   自动属性
        //作用：外部能得不能改的特征
        //如果类中有一个特征是只希望外部能得不能改的 又没什么特殊处理
        //那么可以直接使用自动属性
        public float Height
        {
            //没有在get和set中写逻辑的需求或想法
            //会自动生成成员变量来存储内容
            get;
            set;
        }
        #endregion
    }

    #endregion
    #region     知识点四   成员属性中 get和set前可以加访问修饰符
    //注意：
    //1.默认不加 会使用属性申明时的访问权限
    //2.加的访问修饰符要低于属性的访问权限
    //3.不能让get和set的访问权限都低于属性的权限
    #endregion

    internal class class5
    {
        static void Main(string[] args)
        {
            Console.WriteLine("成员属性");
            #region     知识点三   成员属性的使用
            Person2 p = new Person2();
            p.Name = "charlie";//set
            Console.WriteLine(p.Name);//get

            p.Money = 630;//内存中存储的是635
            Console.WriteLine(p.Money);//返回的是630

            Console.WriteLine(p.Sex);
            #endregion

            #region     作业
            //定义一个学生类，有五种属性，分别为姓名、性别、年龄、CSharp成绩、Unity成绩
            //有两个方法：
            //一个打招呼：介绍自己是XX，今年几岁了。是男同学还是女同学
            //计算自己总分数和平均分并显示的方法
            //使用属性完成：年龄必须是0~150岁之间，成绩必须是0~100
            //性别只能是男或女
            //实例化两个对象并测试
            student st1 = new student();
            st1.name = "秦洛南";
            st1.Age = 17;
            st1.Sex = "女";
            st1.Csharp = 87;
            st1.Unity = 95;
            st1.Speak();
            st1.Score();
            #endregion

        }
    }
    //作业
    class student
    {
        private int age;
        private int csharp;
        private int unity;
        private string sex;
        public string name
        {
            get;
            set;
        }
        public string Sex
        {
            get
            {
                return sex;
            }
            set
            {
                if(value == "男" || value == "女" )
                {
                    sex = value;
                }
                else
                {
                    Console.WriteLine("性别错误！");
                }
            }
        }
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if(value < 0 && value > 150)
                {
                    Console.WriteLine("年龄错误！");
                }
                age = value;
            }
        }
        public int Csharp
        {
            get
            {
                return csharp;
            }
            set
            {
                if(csharp > 100 && csharp < 0)
                {
                    Console.WriteLine("成绩错误！");
                }
                csharp = value;
            }
        }
        public int Unity
        {
            get
            {
                return unity;
            }
            set
            {
                if (unity > 100 && unity < 0)
                {
                    Console.WriteLine("成绩错误！");
                }
                unity = value;
            }
        }
        public void Speak()
        {
            Console.WriteLine("我是{0}，今年{1}岁，性别是{2}",name,age,sex);
        }
        public void Score()
        {
            int Zscore = Csharp + Unity;
            int Pscore = Zscore / 2;
            Console.WriteLine("我的总分是{0}，平均分是{1}",Zscore,Pscore);
        }
    }
}
